/*
 * This file is part of artnet.
 *
 * Copyright 2009 Karsten Schmidt (PostSpectacular Ltd.)
 *
 * artnet is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * artnet is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with artnet. If not, see <http://www.gnu.org/licenses/>.
 */

package com.zjpavt.client.artnet;

import java.net.InetAddress;
import java.util.logging.Logger;

import com.zjpavt.client.artnet.packets.ArtPollReplyPacket;
import com.zjpavt.client.artnet.packets.ByteUtils;

public class ArtNetNode {

    protected static final Logger logger = Logger.getLogger(ArtNetNode.class
                                           .getClass().getName());

    protected final NodeStyle nodeStyle;

    private InetAddress ip;

    private int subSwitch;

    private int oemCode;

    private int nodeStatus;
    private NodeReportCode reportCode;

    private String shortName;
    private String longName;

    private int numPorts;
    private PortDescriptor[] ports;
    private byte[] dmxIns;
    private byte[] dmxOuts;

    public ArtNetNode() {
        this(NodeStyle.ST_NODE);
    }

    public ArtNetNode(NodeStyle style) {
        nodeStyle = style;
    }

    public void extractConfig(ArtPollReplyPacket source) {
        setIPAddress(source.getIPAddress());
        subSwitch = source.getSubSwitch();
        oemCode = source.getOEMCode();
        nodeStatus = source.getNodeStatus();
        shortName = source.getShortName();
        longName = source.getLongName();
        ports = source.getPorts();
        numPorts = ports.length;
        reportCode = source.getReportCode();
        dmxIns = source.getDmxIns();
        dmxOuts = source.getDmxOuts();
        logger.info("updated node config");
    }

    /**
     * @return the dmxIns
     */
    public byte[] getDmxIns() {
        return dmxIns;
    }

    /**
     * @return the dmxOuts
     */
    public byte[] getDmxOuts() {
        return dmxOuts;
    }

    /**
     * @return the ip
     */
    public InetAddress getIPAddress() {
        return ip;
    }

    /**
     * @return the longName
     */
    public String getLongName() {
        return longName;
    }

    /**
     * @return the nodeStatus
     */
    public int getNodeStatus() {
        return nodeStatus;
    }

    /**
     * @return the nodeStyle
     */
    public NodeStyle getNodeStyle() {
        return nodeStyle;
    }

    /**
     * @return the numPorts
     */
    public int getNumPorts() {
        return numPorts;
    }

    /**
     * @return the oemCode
     */
    public int getOemCode() {
        return oemCode;
    }

    /**
     * @return the ports
     */
    public PortDescriptor[] getPorts() {
        return ports;
    }

    /**
     * @return the reportCode
     */
    public NodeReportCode getReportCode() {
        return reportCode;
    }

    /**
     * @return the shortName
     */
    public String getShortName() {
        return shortName;
    }

    public int getSubNet() {
        return subSwitch;
    }

    public String getSubNetAsHex() {
        return ByteUtils.hex(subSwitch, 2);
    }

    public void setIPAddress(InetAddress ip) {
        this.ip = ip;
    }

    @Override
    public String toString() {
        return "node: " + nodeStyle + " " + ip + " " + shortName + ", "
               + numPorts + " ports, subswitch: "
               + ByteUtils.hex(subSwitch, 2);
    }
}
